"""
@author: mark
@contact: QQ:1241642375
@Created on: 2024年8月17日14:20:33
@Remark: 销售数据表
"""
from email.policy import default

from django.core.exceptions import ValidationError
from django.db import models


# Create your models here.

from dvadmin.utils.models import CoreModel, SoftDeleteModel
from dvadmin.system.models import Dictionary, Dept

from django.core.validators import RegexValidator


class SaleField(CoreModel, SoftDeleteModel):
    # 字段分类的选项
    FIELD_CATEGORY_CHOICES = [
        (1, '收入'),
        (2, '推广成本'),
        (3, '产品成本'),
        (4, '团队成本'),
        (5, '统计'),
        (6, '其他'),
    ]

    # 字段分类, 字段分类应该写活，写到字典中，用户自己配置，字典的key就是field_category
    field_category = models.IntegerField(choices=FIELD_CATEGORY_CHOICES, null=True, blank=True, verbose_name='字段分类')

    # 字段名称
    field_name = models.CharField(
        max_length=50,
        verbose_name="字段名称"
    )

    # 字段key  名字唯一不能重复
    field_key = models.CharField(
        max_length=50,
        validators=[RegexValidator(
            regex='^[a-z0-9_]+$',
            message='字段名字只能包含小写字母、数字和下划线',
        )],
        verbose_name="字段key",
        unique=True
    )

    # 计算类型的选项
    CALCULATION_TYPE_CHOICES = [
        ('user_input', '用户输入'),
        ('auto_calculate', '自动计算'),
        ('user_select', '用户选择'),
    ]

    # 计算类型
    calculation_type = models.CharField(
        max_length=20,
        choices=CALCULATION_TYPE_CHOICES,
        verbose_name="计算类型"
    )

    # 计算方案（非必填字段）
    calculation_formula = models.TextField(blank=True, null=True, verbose_name="计算方案")

    # 选择列表（如果计算类型选择了用户选择，这个字段是必须的）
    selection_list = models.CharField(max_length=30, verbose_name="可选字典key", blank=True, null=True)

    # 是否可以编辑
    edit_en = models.BooleanField(default=True, verbose_name="是否可以编辑")

    def __str__(self):
        return self.field_name

    class Meta:
        verbose_name = '数据字段'
        verbose_name_plural = verbose_name
        ordering = ('-create_datetime',)




class SaleData(CoreModel, SoftDeleteModel):
    """
    销售数据表，用于存放每个部门或者店铺的销售数据
    包含三个字段
    1、部门  CoreModel 带有这个字段
    2、记录时间
    3、销售数据
    sale_data = {
        "sale_number": 100,
        "covar": 10,
        "dis_count": 200,
    }
    """
    department = models.ForeignKey(
        to=Dept,
        verbose_name="所属部门",
        on_delete=models.PROTECT,
        db_constraint=False,
        null=True,
        blank=True,
        help_text="关联部门",
    )
    sale_time = models.DateField(verbose_name="销售日期", help_text="销售日期")
    sale_data = models.JSONField(verbose_name="销售数据", help_text="销售数据")
    def __str__(self):
        return self.department.name
    class Meta:
        verbose_name = '销售数据'
        verbose_name_plural = verbose_name
        ordering = ('-sale_time',)
        # 联合唯一索引
        unique_together = ('department', 'sale_time')

